#ifndef YPL_CWT_H
#define YPL_CWT_H

#include "Array1D.h"

namespace ypl
{



/*!
 * @brief 连续小波变换
 */
class CWT
{
public:
	/*!
     * @brief 连续小波变换的小波类型
	 */
    enum  WaveletType
    {
        WT_HAAR     ///< haar小波
    };

public:

    /*!
     * @brief 一维复数序列的连续小波变换
     * @param aIn       -in-  待变换的复数序列
     * @param aOut      -out- 小波变换的结果
     * @param scale     -in-  尺度因子
     * @param waveType  -in-  小波类型
     */
    void operator () (const Array1D<Complex>& aIn,
                      Array1D<Complex>& aOut,
                      Real scale,
                      WaveletType waveType);

    /*!
     * @brief 一维实数序列的连续小波变换
     * @param aIn       -in-  待变换的实数序列
     * @param aOut      -out- 小波变换的结果
     * @param scale     -in-  尺度因子
     * @param waveType  -in-  小波类型
     */
    void operator () (const Array1D<Real>& aIn,
                      Array1D<Complex>& aOut,
                      Real scale,
                      WaveletType waveType);

private:
    void cwtHaar(const Array1D<Complex>& aIn,
                 Array1D<Complex>& aOut,
                 Real scale);
    Complex haarFt(Real omega);
};


}

#endif // YPL_CWT_H
